package com.isczy.educms.controller;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import com.isczy.educms.service.MsmService;
import com.isczy.servicebase.exceptionHandler.MyException;
import com.isczy.utils.DataResult;
import com.isczy.utils.ResultCode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/***
 * ***************************************
 * 功能描述:短信服务
 * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-14 14:29】
 * @author modify:
 */
@RestController
@RequestMapping("/educms/msm")
public class MsmController {

    @Autowired
    private MsmService msmService;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /***
     * ***************************************
     * 功能描述:发送短信的方法
     * @param phone
     * @return {@link DataResult}
     * @author create: TODO 人员:【ChangZiYang】类型:【新增方法】日期:【2021-01-14 14:30】
     * @author modify:
     */
    @GetMapping("send/{phone}")
    public DataResult sendMsm(@PathVariable String phone) {
        if (StrUtil.isEmpty(phone)){
            return DataResult.builder()
                    .message("请输入手机号")
                    .errorBuild();
        }
        try{
            //1 从redis获取验证码，如果获取到直接返回
            String code = redisTemplate.opsForValue().get(phone);
            if(!StringUtils.isEmpty(code)) {
                return DataResult.builder()
                        .message("验证码未失效，请勿重复发送")
                        .successBuild();
            }
            //2 如果redis获取不到，进行阿里云发送
            //生成随机值，传递阿里云进行发送
            code = RandomUtil.randomNumbers(4);
            Map<String,Object> param = new HashMap<>();
            param.put("code",code);
            //调用service发送短信的方法,因为签名申请不下来，所以在此写死，验证码固定6666
            //boolean isSend = msmService.send(param,phone);
            boolean isSend = true;
            if(isSend) {
                //发送成功，把发送成功验证码放到redis里面
                //设置有效时间
                redisTemplate.opsForValue().set(phone,"6666",5, TimeUnit.MINUTES);
                return DataResult.builder()
                        .message("发送成功")
                        .successBuild();
            } else {
                return DataResult.builder()
                        .message("发送失败")
                        .errorBuild();
            }
        }catch (Exception e){
            throw MyException.builder()
                    .exception(e)
                    .code(ResultCode.ERROR)
                    .className(getClass().getName())
                    .methodName(Thread.currentThread().getStackTrace()[1].getMethodName())
                    .message("发送失败")
                    .params(phone)
                    .build();
        }

    }
}
